package juc;

import java.util.concurrent.atomic.AtomicInteger;

/*
* 一、i++的原子性问题:
*         int i = 10;
*         int j = i++  // 10
*         int i = i++
*
* 二、原子变量：jdk1.5后java.util.concurrent.atomic包下提供了常用的原子变量
*           1.Volatile 保存内存的可见性
*           2 CAS(Compare-And-Swap)算法保证数据原子性
*               CAS算法是硬件对于并发操作共享数据的支持
*               CAS包含了三个操作数符：
*               内存值 V
*               预估值 A
*               更新值 B
*               当且仅当 V == A 时，V = B，否则，不进行任何操作
*
*
* */
public class TestAtomicDemo {
    public static void main(String[] args) {
        int i = 10;
        i = i++;
        int j = i++;
        System.out.println(i+" "+j);
        AtomicDemo ad = new AtomicDemo();
        for (int k = 0; k < 10; k++) {
            new Thread(ad).start();
        }

    }
}
class AtomicDemo implements Runnable {
    private AtomicInteger serialNumber = new AtomicInteger();

    @Override
    public void run() {
        try {
            Thread.sleep(200);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + ": " + getSerialNumber());
    }

    public int getSerialNumber() {
        return serialNumber.getAndIncrement();
    }
}
